#include "CourseManager.h"
#include "Course.h"
#include "iostream"




// 构造函数：根据课程vector创建CourseManager
CourseManager::CourseManager(const vector<Course> &courseVect)
{
    for(const auto x:courseVect)
        courseList.push_back(x);
}


// 添加新的课程
void CourseManager::AddCourse(const Course &course)
{
    
    courseList.push_back(course);
}
void CourseManager::AddCourse(const string &courseName)
{
    Course course(courseName);
    courseList.push_back(course);
}

// 删除课程：删除最后一个课程
void CourseManager::RemoveLast()
{
    try
    {
        if(!courseList.empty())//大概率发生的事情，发在前面
        {
           courseList.pop_back();
           cout<<"delete succcefully!"<<endl;
        }
        else//小概率发生的事情，放在后面。
        {
            throw runtime_error("delete error:courseList is empty when delete.");
        }

    }
    catch(runtime_error err)
    {
        cout<<err.what()<<endl;
    }

}

// 删除课程：删除指定名称的课程
void CourseManager::RemoveByName(const string &name)
{
    int index=FindCourse(name);
    if(index>0)
    {
        courseList.erase(courseList.begin()+index);
    }
    else
    {
        cout<<"Not Found"<<endl;
    }
}

// 删除课程：删除指定ID的课程
void CourseManager::RemoveById(int id)
{
    int index=FindCourse(id);
    if(index>0)
    {
        courseList.erase(courseList.begin()+index);
    }
    else
    {
        cout<<"Not Found"<<endl;
    }
}

// 打印课程列表信息
void CourseManager::PrintAllCourse()
{
    for(const auto &x:courseList)
    {
        cout<<x<<endl;
    }
}

// 根据课程名称打印指定课程信息
void CourseManager::PrintCourse(const string &name)
{
    int index=FindCourse(name);
    if(index>0)
    {
        cout<<courseList[index]<<endl;
    }
    else
    {
        cout<<"Not Found"<<endl;
    }
    
}

// 根据课程ID打印指定课程信息
void CourseManager::PrintCourse(int id)
{
    int index=FindCourse(id);
    if(index>0)
    {
        cout<<courseList[index]<<endl;
    }
    else
    {
        cout<<"Not Found"<<endl;
    }
}

// 打印名称最长的课程
void CourseManager::PrintLongNameCourse()
{
    // auto &max=courseList[0];
    // int max_lenth=0;
    // for(const auto &x:courseList)
    // {
    //     int xSize=x.GetName().size();
    //     if(xSize>max_lenth)
    //     {
    //         max_lenth=xSize;
    //         max=x; //max永远指向已遍历序列中最长的。
    //     }
    // }
    // cout<<max<<endl;

        
    int maxLen = 0;
    
    //遍历courseList，查找最长名称
    for (auto curs = courseList.begin(); curs != courseList.end(); ++curs){
        int currentLen = curs->GetName().size();
        if (currentLen > maxLen)
            maxLen = currentLen;
    }
    
    //遍历courseList，打印所有最长名称课程(有可能不止一个)
    for (auto curs = courseList.begin(); curs != courseList.end(); ++curs){
        if (curs->GetName().size() == maxLen)
            cout << *curs << endl;
    }
}




// 根据课程名称查找课程，返回课程列表中的索引值，无法找到返回-1
int CourseManager::FindCourse(const string &name)
{
    int index=0;
    for(const auto &x:courseList)
    {
        if(name==x.GetName())
        {
            return index;
        }
        index++;
    }
    return -1;
}

// 根据课程ID查找课程，返回课程列表中的索引值，无法找到返回-1
int CourseManager::FindCourse(int id)
{
    int index=0;
    for(const auto &x:courseList)
    {
        if(id==x.GetId())
        {
            return index;
        }
        index++;
    }
    return -1;
}